<?php

/**
 * Class Repeat
 * 定时、重复执行excute()方法
 * 抽象类，必须实现excute()方法
 * 在excute()中实现要执行的动作
 *  *
 */
abstract class Repeat{

    //excute()可以调用的参数
    protected $arr;
    //开始时间
    private $sentTime=0;
    ////程序主循环的时间间隔，默认2s
    private $checkInterval=2;
    //log路径
    private $logPath="d:/cLOG.txt";
    //excute执行的间隔
    private $sendInterval;
    //excute执行的次数
    private $times;
    //参数
    private $config=[];



    //读取参数
    private function readConfig(){
        $json_string = file_get_contents('config.php');
        $this->config = json_decode($json_string, true);// 把JSON字符串转成PHP数组
    }
    //修改参数
    private function setConfig($key,$value){
        $this->config[$key]=$value;
        $json_string = json_encode($this->config);
        file_put_contents("config.php",$json_string);// 写入文件

    }

    //抽象方法，在这里实现要重复执行的操作
     protected abstract function excute();


    /**
     * Repeat constructor.
     * @param $sTime 第一次执行的时间
     * @param $arr 要执行的方法的参数
     * @param int $sendInterval 方法重复执行的间隔
     * @param int $times 方法重复执行的次数
     */
    public function __construct($sTime,$arr,$sendInterval=60,$times=PHP_INT_MAX)
    {

        $this->arr=$arr;
        $this->sentTime=strtotime($sTime);//发送时间转化为毫秒
        $this->sendInterval=$sendInterval;
        $this->times=$times;
    }

    /**
     * 启动
     */
    public function start(){
        //忽略客户端，时间无限制
        ignore_user_abort(0);
        set_time_limit(0);

        //重置continue=1
        $this->readConfig();
        $this->setConfig("continue",1);


        global $count;
        $count=0;//外循环计数器，用于cLog.txt
        $countMail=1;//执行次数计数器
        while (true ){
            $count++;
            file_put_contents($this->logPath,"$count\n",FILE_APPEND);

            //读取continue
            $this->readConfig();
            $continue=$this->config["continue"];

            if(!$continue){//continue为0时结束脚本
                $msg= "Stopped by someone";
                file_put_contents($this->logPath,$msg."\n",FILE_APPEND);//
                die("<br>Stopped");
            }

            $now=time();//当前秒数
            if($now>=$this->sentTime){//当前时间>=设定时间，执行动作
                $this->excute();

                $this->sentTime+=$this->sendInterval;//设定下一次执行时间
                $countMail++;//执行次数
                file_put_contents($this->logPath,date("H:i:s")."==>$countMail\n",FILE_APPEND);

                if ($countMail>$this->times){
                    $countMail--;
                    die("<br>$countMail mails  sent");
                }


            }else{
                file_put_contents($this->logPath,date("H:i:s",$now)."==>".date("H:i:s",$this->sentTime)."\n",FILE_APPEND);
            }
            sleep($this->checkInterval);
        }
    }


}